package com.tmt.im.jpa.entity;

import com.tmt.data.jpa.entity.TmtBaseCreatorId;
import com.tmt.im.common.enums.ChatSessionType;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.SuperBuilder;

import java.io.Serial;
import java.sql.Timestamp;
import java.util.List;

/**
 * 聊天会话表
 *
 * @Description TODO
 * @Author wuyi
 * @Date 2024/7/18 13:20
 * @Version 1.0
 **/
@Getter
@Setter
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "chat_session")
@Tag(name = "chat_session", description = "聊天会话表")
public class ChatSession extends TmtBaseCreatorId {

    @Serial
    private static final long serialVersionUID = -8521855581136330259L;

    /**
     * 聊天会话名称
     */
    @Column(nullable = false)
    private String name;

    /**
     * 群组头像，存储的是头像图片的访问URI。
     */
    @Schema(name = "avatar", description = "群组头像")
    private String avatar;

    /**
     * 聊天会话类型，
     * 双人会话不允许更新群主（此时群主默认等于创建者）
     * 双人会话不允许添加第三个成员。
     */
    @Enumerated(EnumType.STRING)
    private ChatSessionType type;

    /**
     * 最大成员数量，默认是5000，这个值从群详情中读取的。
     */
    private int maxMemberAmount = -1;

    /**
     * 成员数量限额，这个是群主设置的值，不能大于maxMemberAmount
     */
    private int memberAmountLimit = -1;

    /**
     * 群发言状态。仅对GROUP类型的会话有效。
     * 0（默认）：取消群组禁言。
     * 1：禁言全体普通成员，不包括群主和管理员。
     * 3：禁言全体成员。"
     */
    @Column(nullable = false)
    private Integer chatBanned = 0;

    /**
     * 本群是否禁止成员相互加为好友
     */
    @Column(nullable = false, columnDefinition = "TINYINT(1)")
    private boolean forbidAddFriend = true;

    /**
     * 是否允许全体成员在该群中抢手气红包。
     */
    @Column(nullable = false, columnDefinition = "TINYINT(1)")
    private boolean allowRedPackage = true;

    /**
     * 通过 SDK 侧操作申请入群的验证方式。
     * 0（默认）：无需验证，直接入群。
     * 1：需要群主或管理员验证通过才能入群。
     * 2：不允许任何人申请入群。
     */
    private Integer joinMode;

    /**
     * 邀请入群时是否需要被邀请人的同意。
     * 0（默认）：需要被邀请人同意才能入群。
     * 1：不需要被邀请人同意，直接入群。
     */
    private Integer beInvitedMode;

    /**
     * 邀请权限，即谁可以邀请他人入群。
     * 0（默认）：群主和管理员。
     * 1：所有人。
     */
    private Integer inviteMode;

    /**
     * 客户端修改群组信息的权限，即谁可以修改群组信息。
     * 0（默认）：群主和管理员。
     * 1：所有人。
     */
    private Integer updateTeamInfoMode;

    /**
     * 客户端修改群自定义扩展信息（server_extension&extension）权限，即谁可以修改群自定义扩展信息。
     * 0（默认）：群主和管理员。
     * 1：所有人。
     */
    private Integer updateExtensionMode;

    /**
     * 群公告信息
     */
    private String announcement;

    /**
     * 群介绍
     */
    private String introduce;

    /**
     * 聊天会话的群主， 双人会话类型时本字段等于会话创建人。
     */
    @Column(name = "owner_id")
    private Long ownerId;

    @Column(name = "deleted")
    private boolean deleted = false;

    @Column(name = "delete_time")
    @Temporal(TemporalType.TIMESTAMP)
    private Timestamp deleteTime;

    @OneToMany(mappedBy = "session", cascade = {CascadeType.REFRESH}, fetch = FetchType.LAZY)
    private List<RedPackage> redPackages;

    @OneToMany(mappedBy = "session", cascade = {CascadeType.REFRESH}, fetch = FetchType.LAZY)
    private List<RedPackageDetail> redPackageDetails;

}
